home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / archiver / ltarv3.zip / XD.C < prev    next >
C/C++ Source or Header  |  1991-11-08  |  2KB  |  117 lines

  1. #include <ctype.h>
  2. #include <dos.h>
  3. #include <dir.h>
  4. #include <errno.h>
  5. #include <io.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9. #include <sys\stat.h>
  10.  
  11. #define MAXPAT    256
  12.  
  13. char curDir[MAXPAT] ;
  14. char tDrv[3], tDir[MAXPAT], tName[9], tExt[5] ;
  15. char *loc ;
  16.  
  17. int halt = 0, recur = 0 ;
  18.  
  19. struct fcb tag ;
  20. struct REGPACK regs ;
  21.  
  22. void error( char *fname, char *cau ) {
  23.  
  24.     fprintf( stderr, "%s error : %s ", cau, fname ) ;
  25.     switch ( errno ) {
  26.         case ENOENT :
  27.             fputs( "path or file not found.\n", stderr ) ;
  28.             break ;
  29.         case EACCES :
  30.             fputs( "permission denied.\n", stderr ) ;
  31.             break ;
  32.         default :
  33.             fprintf( stderr, "error no - %d\n", errno ) ;
  34.     }
  35. }
  36.  
  37. void usage( void ) {
  38.  
  39.     fprintf( stderr, "Usage: XD [Dir]\n\te.g. XD F:\\TEMP\\ or XD TEMP\\\n" ) ;
  40.     exit( - 1 ) ;
  41. }
  42.  
  43. attachTarget( char *loc ) {
  44.  
  45.     int c ;
  46.     char d ;
  47.  
  48.     c = fnsplit( loc, tDrv, tDir, tName, tExt ) ;
  49.  
  50.     if ( c & DRIVE ) {
  51.         d = toupper( tDrv[0] ) - 'A' ;
  52.         setdisk( d ) ;
  53.         if ( getdisk() != d )
  54.             return 0 ;
  55.     }
  56.     if ( c & DIRECTORY )
  57.         if ( chdir( tDir ) ) {
  58.             tDir[strlen( tDir ) - 1] = 0 ;
  59.             if ( chdir( tDir ) )
  60.                 return 0 ;
  61.         }
  62.     if ( c & FILENAME )
  63.         usage() ;
  64.  
  65.     regs.r_ds = FP_SEG( &tag ) ;
  66.     regs.r_ax = 0x1300 ;
  67.     regs.r_dx = FP_OFF( &tag ) ;
  68.  
  69.     return 1 ;
  70. }
  71.  
  72. int d ;
  73.  
  74. void recusiveSearch( void ) {
  75.  
  76.     struct ffblk dir ;
  77.     int c ;
  78.  
  79.     for ( c = findfirst( "*.*", &dir, FA_DIREC | FA_ARCH ) ; !c ;
  80.         c = findnext( &dir ) ) {
  81.         d = dir.ff_attrib ;
  82.         loc = dir.ff_name ;
  83.         if ( d & FA_DIREC ) {
  84.             if ( *loc != '.' ) {
  85.                 chdir( loc ) ;
  86.                 recusiveSearch() ;
  87.                 loc = dir.ff_name ;
  88.                 if ( rmdir( loc ) )
  89.                     error( loc, "RMDIR" ) ;
  90.             }
  91.         } else if ( d & FA_RDONLY || d & FA_HIDDEN || d & FA_SYSTEM )
  92.             if ( chmod( loc, S_IREAD | S_IWRITE ) )
  93.                 error( loc, "CHMOD" ) ;
  94.  
  95.     }
  96.  
  97.     parsfnm( "*.*", &tag, 1 ) ;
  98.     intr( 0x21, ®s ) ;
  99.     chdir( ".." ) ;
  100. }
  101.  
  102. void main( int argc, char *argv[] ) {
  103.  
  104.     if ( argc != 2 )
  105.         usage() ;
  106.  
  107.     getcwd( curDir, MAXPAT ) ;
  108.  
  109.     if ( attachTarget( argv[1] ) )
  110.         recusiveSearch() ;
  111.     argv[1][strlen(argv[1])-1] = 0 ;
  112.     if ( rmdir( argv[1] ) )
  113.         error( argv[1], "RMDIR" ) ;
  114.  
  115.     setdisk( curDir[0] - 'A' ) ;
  116.     chdir( curDir ) ;
  117. }